package com.briup.day13;

import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;

/**
 * 断言工具类，当传入的参数符合条件时返回，
 * 不符合条件时，抛出异常
 */
public class AssertUtil {

    /**
     * 判断你传入的字符串参数是否存在有效的字符，
     * 如果存在继续操作，如果不存在那么直接抛出异常
     */
    public static void hasText(String str) {
        hasText(str, "字符串不能为空");
    }

    /**
     * 判断传入的字符串是否为空，如果为空抛出异常，异常的消息提示由
     * 使用本方法时通过第二个参数继续传递
     *
     * @param str     字符串对象
     * @param message 出现异常时抛出的异常消息
     */
    public static void hasText(String str, String message) {
        if (str == null || str.isBlank()) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 需要判断你传入的参数对象是否为空，
     * 如果为空，抛出空指针异常
     *
     * @param obj 你传入的对象
     */
    public static void requiredNotNull(Object obj) {
        if (obj == null) {
            throw new NullPointerException("当前对象为null");
        }
    }

    /**
     * 判断你传入的对象是否为空，期待不为空
     *
     * @param obj     传入的对象
     * @param message 自定义消息
     */
    public static void requiredNotNull(Object obj, String message) {
        if (obj == null) {
            throw new NullPointerException(message);
        }
    }

    /**
     * 期望你传入的参数为null，不为null时抛出不合法状态异常
     *
     * @param obj     你传入的对象
     * @param message 自定义消息
     */
    public static void requiredNull(Object obj, String message) {
        if (obj != null) {
            throw new IllegalStateException(message);
        }
    }

    /**
     * 检查你传入的表达式是否为true，如果不为true，给其抛出异常
     *
     * @param expression 布尔类型表达式
     * @param message    自定义消息
     */
    public static void check(boolean expression, String message) {
        if (!expression) {
            throw new RuntimeException(message);
        }
    }

    /**
     * 校验你传入的表达式是否为false，如果为false抛出异常
     *
     * @param expression 需要校验的表达式
     * @return 函数式接口对象，用于自定义传入异常类型
     */
    private static Function<RuntimeException, Void> check0(boolean expression) {
        if (!expression) {
            return (e) -> {
                throw e;
            };
        }
        return null;
    }

    public static void check(boolean expression, RuntimeException e) {
        Optional.ofNullable(check0(expression))
                .ifPresent(f -> f.apply(e));
    }
}
